//实现 pow(x, n) ，即计算 x 的 n 次幂函数（即，xⁿ ）。 
//
// 
//
// 示例 1： 
//
// 
//输入：x = 2.00000, n = 10
//输出：1024.00000
// 
//
// 示例 2： 
//
// 
//输入：x = 2.10000, n = 3
//输出：9.26100
// 
//
// 示例 3： 
//
// 
//输入：x = 2.00000, n = -2
//输出：0.25000
//解释：2-2 = 1/22 = 1/4 = 0.25
// 
//
// 
//
// 提示： 
//
// 
// -100.0 < x < 100.0 
// -231 <= n <= 231-1 
// -104 <= xⁿ <= 104 
// 
// Related Topics 递归 数学 👍 853 👎 0

package leetcode.editor.cn;
//Java：Pow(x, n)
class PowxN{
    public static void main(String[] args) {
        Solution solution = new PowxN().new Solution();
        // TO TEST
        solution.myPow(1.00000 ,-2147483648);
    }
    
    //leetcode submit region begin(Prohibit modification and deletion)
    /**
    回溯法：要计算x^n，先计算x^(n/2),即 x^(n/2) = y
     n为偶数时，x^n = y^2, n为奇数时，x^n = y^2 * x
     坑点：
     测试用例n=-2147483648,转为整数时超过int范围，导致-n的值还是负数，无法进入下一步，导致stackoverflow
     */
class Solution {
    public double myPow(double x, int n) {
        if (n < 0) {
            return 1.0 / myPowFuck(x, -n);
        }
        return myPowFuck(x, n);

    }

    public double myPowFuck(double x, int n) {
        if (n == 0) {
            return 1.0;
        }

        double y = myPow(x, n/2);
        return n % 2 == 0 ? y * y : y * y * x;
    }

//        public double myPow(double x, int n) {
//            int N = n;
//            return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);
//        }
//
//        public double quickMul(double x, int N) {
//            if (N == 0) {
//                return 1.0;
//            }
//            double y = quickMul(x, N / 2);
//            return N % 2 == 0 ? y * y : y * y * x;
//        }
}
//leetcode submit region end(Prohibit modification and deletion)

}
